/************************************************************
 * Project Name         [Thinking_In_Java]
 * File Name            [Example_02_LinkedList.java]
 * Creation Date        [01-Jul-2014]
 * 
 * Copyright© ge.y.yang@gmail.com All Rights Reserved
 * 
 * Work hard, play harder, think big and keep fit
 ************************************************************/
package pkg_06_collections;

import java.util.LinkedList;

/**
 * 集合框架 java.util.LinkedList
 * 
 * 使用LinkedList模拟一个堆栈
 * 
 * @author 不落的太阳(Sean Yang)
 * @version 1.0
 * @since JDK 6
 * 
 */
public class Example_02_LinkedList {

	/**
	 * 测试方法
	 * 
	 * @param args
	 *            命令行参数
	 */
	public static void main(String[] args) {
		ImitationQueue<String> myQueue = new ImitationQueue<String>();
		// 向队列插入元素
		myQueue.add("aaa");
		myQueue.add("bbb");
		myQueue.add("ccc");
		myQueue.add("bbb");
		myQueue.add("ccc");
		myQueue.add("bbb");
		// 获取第一个元素
		System.out.println("队首的数据是: " + myQueue.peek());
		// 删除元素
		myQueue.remove();
		// 获取第一个元素并删除
		System.out.println("从队列弹出数据: " + myQueue.pop());
		// 查找bbb第一次出现的位置
		System.out.println("bbb第一次在队列中出现的位置: " + myQueue.indexOf("bbb"));
		// 查找bb最后一次出现的位置
		System.out.println("bbb最后一次在队列中出现的位置: " + myQueue.lastIndexOf("bbb"));
		// 清除队列中的所有元素
		myQueue.clear();
		// 判断队列中的元素个数是否为0
		System.out.println("队列中的元素个数为0: " + myQueue.isEmpty());
	}

}

/**
 * 模拟队列: 数据元素只能从队尾进入, 从队首取出;<br>
 * 在队列中, 数据元素可以任意增减, 但数据元素的次序不会改变;<br>
 * 每当有数据元素从队列中被取出,后面的数据元素依次向前移动一位, 所以, 任何时候从队列中读到的都是队首的数据;
 * 
 * @author 不落的太阳(Sean Yang)
 * @version 1.0
 * @since JDK 6
 */
class ImitationQueue<T> {

	private LinkedList<T> data = new LinkedList<T>();

	/**
	 * 构造方法
	 */
	public ImitationQueue() {
	}

	/**
	 * 向队列添加一个元素, 只能加入到队尾
	 * 
	 * @param t
	 */
	public void add(T t) {
		this.data.addLast(t);
	}

	/**
	 * 查看队首元素, 数据还保留在队列中
	 * 
	 * @return 队首元素
	 */
	public T peek() {
		if (data.isEmpty()) {
			System.out.println("队列中没有元素!");
			return null;
		}
		return data.getFirst();
	}

	/**
	 * 删除队首元素
	 * 
	 * @return 队首元素
	 */
	public boolean remove() {
		if (data.isEmpty()) {
			System.out.println("队列中没有元素!");
			return false;
		}
		data.removeFirst();
		return true;
	}

	/**
	 * 弹出元素, 即获取队首元素并将其从队列中删除
	 * 
	 * @return 队首元素
	 */
	public T pop() {
		if (data.isEmpty()) {
			System.out.println("队列中没有元素!");
			return null;
		}
		return data.removeFirst();
	}

	/**
	 * 在队列中查找元素, 返回第一次出现的位置
	 * 
	 * @param t
	 * @return 元素第一次出现的位置
	 */
	public int indexOf(T t) {
		return data.indexOf(t);
	}

	/**
	 * 在队列中查找元素, 返回最后一次出现的位置
	 * 
	 * @param t
	 * @return 元素最后以此出现的位置
	 */
	public int lastIndexOf(T t) {
		return data.lastIndexOf(t);
	}

	/**
	 * 判断队列是否为空
	 * 
	 * @return 是否为空
	 */
	public boolean isEmpty() {
		return data.isEmpty();
	}

	/**
	 * 清除队列中所有元素
	 */
	public void clear() {
		data.clear();
	}

}
